iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0
SideProject30

拿到一支Garmin錶,要怎麼開發app?系列 第 14

[Day-14] Monkey C的那些規則-8-weak reference & strong reference

  • 分享至 

  • xImage
  •  

昨天提到,我們可以使用method來將function儲存到另一個物件來達到物件化的效果,
function存到另一個物件之後,這個物件跟function原本所在的物件就會保持strong reference的關係,
因此只要這個儲存function的物件還存在,原本存著這個function的class就不會被消滅。

另一種情況是weak reference

由於Monkey C是使用Reference Counting的方式來管理記憶體,
只要沒有其他地方引用這個物件,那Monkey C就會消滅它以達到降低記憶體使用量的效果。
從官方的說明有提出一個情境例子如下:
有3個物件A、B、C,
一開始,物件C引用物件A,物件A又引用物件B,物件B又又引用物件A,
後來物件C沒有引用物件A了,情況變成只剩物件A跟物件B互相引用,
尷尬的情況出現了,物件C已經可以被消滅,
但物件A、B,永遠沒辦法消滅,因為他們雙方都被對方引用,被引用的物件不能被消滅。

要解決這個困擾就可以用weak reference,使用weak()來建立weak reference

var b = a.weak()

這樣B對A就是weak reference的關係,
這樣一來,沒人對A有strong reference,A可以正常被消滅,
沒人引用B,B也可以被消滅了

如果要確認weak refrence的對象有沒有消滅,可使用.stillAlive()
如果要從weak reference改為使用strong reference,可以使用.get()

if (weakReference.stillAlive()) {
    var strongReference = weakReference.get();
    strongReference.myMethod();
}

上一篇
[Day-13] Monkey C的那些規則-7-callback
下一篇
[Day-15] Monkey C的那些規則-9-Scoping
系列文
拿到一支Garmin錶,要怎麼開發app?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言